<?php

// namespace App\Http\Controllers;

// use App\Http\Admin;

namespace App\Http\Controllers\Admin;

use App\Http\Requests\AdminRequest;
use App\Models\Admin;
use Illuminate\Http\Request;
use App\Http\Kernel;
use Illuminate\Support\Facades\Hash;
use Laravel\Passport\TokenRepository;
use App\Http\Controllers\BaseAdminController;

class AdminController extends BaseAdminController
{
    //排除login 这个方法是不需要登录的，所以不需要验证是否有token
    protected $auth_except = ['login'];

    //登录
    public function login(AdminRequest $request)
    {
        //下面这个 是使用模型Admin中的findForPassport方法 让用户可以使用 除了email意外的其他方式 作为账号，如：name,phone
        $admin = (new Admin)->findForPassport($request->name);

        //验证用户名和密码
        if (!Hash::check($request->password, $admin->password)) {
            //如果验证失败，返回错误信息
            throw new \Exception("账号或密码错误！");
        }
        //构造参数
        $parameters = [
            'grant_type' => 'password',
            'username' => $request->get('name'), //因为有findForPassport()方法，所以可以直接使用phone 或 name 来登录
            'password' => $request->get('password'),  //密码，注册的时候要对其进行加密 如：bcrypt(123456)
            'scope' => '*',
            //使用env()方法时，不可以执行php artisan config:cache；若执行了该命令，env()不会再读取 文件.env。可用php artisan cofig:clear 解决。
            'client_id' => env('ADMIN_CLIENT_ID'),
            'client_secret' => env('ADMIN_CLIENT_SECRET'),
        ];

        //构造一个登录验证的请求
        $tokenRequest = Request::create(route('passport.token'), 'POST', $parameters);

        //使用 Passport 的登录验证器进行验证 获得token
        $response = app(Kernel::class)->handle($tokenRequest);

        //成功 返回token
        if ($response->status() == 200) {
            return response()->json([
                'code' => 200,
                'message' => 'Successfully login!',
                'token' => json_decode($response->content(), true),
            ]);
        } else {
            //失败 返回错误信息
            // throw new \Exception($response->get('message'));
            $response->throwResponse();
        }
    }

    //退出
    public function logout()
    {
        // $token->revoke();

        //清除token
        // $tokenId = $this->admin->token();
        $tokenId = $this->admin->token()->id;
        dump($tokenId);
        $tokenRepository = app(TokenRepository::class);
        return  $tokenRepository->revokeAccessToken($tokenId);
    }

    //修改密码
    public function updatePassword(Admin $admin, AdminRequest $request)
    {
        //新密码和旧密码不能一致
        if ($request->get('old_password') == $request->get('password')) {
            throw new \Exception("新密码和旧密码不能一致！");
        }

        //验证原密码
        if (!Hash::check($request->get('old_password'), $admin->password)) {
            throw new \Exception("原密码错误！");
        }

        //修改密码
        $admin->update(['password' => Hash::make($request->get('password'))]);
        return $this->success('修改成功！');
    }
}
